package xgin

import (
	"bytes"
	"encoding/csv"

	"github.com/gin-gonic/gin"
)

// 导出CSV数据
//
//	xginc	请求结构数据
//	head	CSV表格请求头
//	headkey	CSV表格请求头顺序
//	body	列表数据信息
func DownloadCsv(xginc *gin.Context, head, headkey []string, body any) *Response {
	return DownloadCsvFileMap(xginc, head, headkey, body, "TheCSVFileName", nil)
}

// 导出CSV数据
//
//	xginc	请求结构数据
//	head	CSV表格请求头
//	headkey	CSV表格请求头顺序
//	body	列表数据信息
//	file	下载文件的文件名
func DownloadCsvFile(xginc *gin.Context, head, headkey []string, body any, file string) *Response {
	return DownloadCsvFileMap(xginc, head, headkey, body, file, nil)
}

// 导出CSV数据
//
//	xginc	请求结构数据
//	head	CSV表格请求头
//	headkey	CSV表格请求头顺序
//	body	列表数据信息
//	file	下载文件的文件名
//	m_map	map映射表
func DownloadCsvFileMap(xginc *gin.Context, head, headkey []string, body any, file string, m_map map[string]map[string]string) *Response {
	buf, err := Struct2csv(head, headkey, true, body, m_map)
	if err != nil {
		return Resp().Error(err)
	}
	// 指示下载
	xginc.Writer.Header().Set("Content-Type", "text/csv")
	xginc.Writer.Header().Set("Content-Disposition", "attachment;filename="+file+".csv")
	xginc.Writer.Write(buf)
	return nil
}

// 导出CSV数据
//
//	xginc	请求结构数据
//	body	列表数据信息[含CSV表格头]
//	file	下载文件的文件名
func DownloadCsvData(xginc *gin.Context, body [][]string, file string) *Response {
	// 声明IO
	buffer := &bytes.Buffer{}
	writer := csv.NewWriter(buffer)
	// 写入UTF8声明的BOM头，避免excel打开乱码
	buffer.Write([]byte("\xEF\xBB\xBF"))
	// 写入head
	err := writer.WriteAll(body)
	if err != nil {
		return Resp().Error(err)
	}
	// 指示下载
	xginc.Writer.Header().Set("Content-Type", "text/csv")
	xginc.Writer.Header().Set("Content-Disposition", "attachment;filename="+file+".csv")
	xginc.Writer.Write(buffer.Bytes())
	return nil
}
